<?php
/**

 //  DoYouHaoBaby-X Ucenter ( DoYouHaoBaby-X 计划 )
 //  +---------------------------------------------------------------------
 //
 //  “Copyright”
 //  +---------------------------------------------------------------------
 //	 | (C) 2010 - 2011 http://doyouhaobaby.net All rights reserved.
 //	 | This is not a free software, use is subject to license terms
 //  +---------------------------------------------------------------------
 //
 //  “About This File”
 //  +---------------------------------------------------------------------
 //	 | Ucenter Public控制器
 //  +---------------------------------------------------------------------

*/

!defined( 'DYHB_PATH' ) && exit;

class PublicController extends InitController{


   /**
    * 验证是否登录
    */
   public function is_login( ) {

	   if( !$this->issetCookieData( md5( G::C('USER_AUTH_KEY') ) )  ) {

			$this->assign('jumpUrl',G::U('public/login'));
			$this->E( G::L( '你没有登录！' ) );
	   }

	   $arrUserData = UserModel::M()->userData();
	   if( empty( $arrUserData['user_id'] ) )
	       $this->E( G::L( '你没有登录！' ) );
   }


   /**
    * 后台首页
    */
   public function fmain( ){

   	   $this->is_login();

   	   $oDb = Db::RUN();

	   // 系统统计
	   $this->assign('users', $this->get_uc_users());
	   $this->assign('apps', $this->get_uc_apps());
	   $this->assign('friends', $this->get_uc_friends());

	   // 服务器运行环境
       $arrInfo = array(

		   G::L( 'UCenter 程序版本' )=>"UCenter " .UC_SERVER_VERSION. "  Release " .UC_SERVER_RELEASE." <a href=\"http://doyouhaobaby.net/ucenter\" target=\"_blank\">".G::L( '查看最新版本' )."</a>",
           G::L( '操作系统' )=>PHP_OS,
           G::L( '运行环境' )=>$_SERVER["SERVER_SOFTWARE"],
           G::L( 'PHP运行方式' )=>php_sapi_name(),
	       G::L( '数据库类型' )=>G::C('DB_TYPE'),
		   G::L( '数据库版本' )=>$oDb->getReallyVersion( ),
           G::L( 'DoYouHaoBaby版本' )=>DYHB_VERSION.' [ <a href="http://bbs.56swun.com" target="_blank">'.G::L( '查看最新版本' ).'</a> ]',
           G::L( '上传附件限制' )=>ini_get('upload_max_filesize'),
           G::L( '执行时间限制' )=>ini_get('max_execution_time').G::L( '秒' ),
           G::L( '服务器时间' )=>date( G::L( 'Y年n月j日 H:i:s' ) ),
           G::L( '北京时间' )=>gmdate( G::L( 'Y年n月j日 H:i:s' ),time()+8*3600),
           G::L( '服务器域名/IP' )=>$_SERVER['SERVER_NAME'].' [ '.gethostbyname($_SERVER['SERVER_NAME']).' ]',
           G::L( '剩余空间' )=>round((@disk_free_space(".")/(1024*1024)),2).'M',
           G::L( 'register_globals' )=>get_cfg_var("register_globals")=="1" ? "ON" : "OFF",
           G::L( 'magic_quotes_gpc' )=>(1===get_magic_quotes_gpc())?'YES':'NO',
           G::L( 'magic_quotes_runtime' )=>(1===get_magic_quotes_runtime())?'YES':'NO',
       );

       $this->assign( 'arrInfo',$arrInfo );
       $this->display();
   }

    /**
     * 获取用户数
     */
    public function get_uc_users() {

		return UserModel::F()->all()->getCount( );
	}

    /**
     * 获取项目总数
     */
	public function get_uc_apps() {

		return ApplicationModel::F()->all()->getCount( );
	}

	/**
	 * 获取好友数
	 */
	public function get_uc_friends() {

		return FriendModel::F()->all()->getCount( );
	}

    /**
     * 登录页面
     */
    public function login() {

    	// 没有登录
		if( !$this->issetCookieData( md5( G::C('USER_AUTH_KEY') ) ) ) {

			$this->assign( 'bLoginSeccode',$this->_arrOptions['loginseccode'] );
			$this->display();
		}

		// 已经登录，调转到首页
		else{

			$this->U( 'index/index' );
		}
	}

	/**
	 * 顶部菜单
	 */
    public function fheader( ) {

    	$this->is_login();

		G::C( 'SHOW_RUN_TIME',false);
		G::C( 'SHOW_PAGE_TRACE',false);

		$arrUserData = UserModel::M()->userData();

		$sUserName = isset( $arrUserData['user_nikename'] ) && $arrUserData['user_nikename']
		             ? $arrUserData['user_nikename']
		             : $arrUserData['user_name'];

        // 显示菜单项
        $arrMenuList = UserModel::M()->getTopMenuList( );

	    $this->assign( 'sUserName',$sUserName );
	    $this->assign( 'arrListMenu',$arrMenuList );
	    $this->display( );
	}

   /**
    * 登录后首页
    */
   public function index(){

   	   $this->is_login();

	   // 如果通过认证跳转到首页
	   G::urlGoto(__APP__);
   }

   /**
    * 框架底部
    */
   public function ffooter() {

        $this->is_login();

		G::C('SHOW_RUN_TIME',false);
		G::C('SHOW_PAGE_TRACE',false);
		$this->display( );
	}

   /**
    * 验证码校验
    */
    public function check_seccode( ){

	   if( $this->_arrOptions['loginseccode'] ){

           $sSeccode = Safe::getGpc( 'seccode','G' );

           // 判断验证码是否正确
   	       // 并且尝试捕获错误
   	       UserModel::M( )->checkSeccode( $sSeccode );
   	       if( UserModel::M()->isBehaviorError() ){

               $this->E ( UserModel::M()->getBehaviorErrorMessage() );
           }

	   }

       $this->S( G::L( '验证码正确' ) );
   }


   /**
    * 登录验证
    */
   public function check_login( ){

	   // 判断是否已经登录
       if(  UserModel::M()->isLogin( )  ) 
		   $this->E( G::L( '你已经登录过了。' ) );

   	   // 取得登录用户信息
   	   $sUserName = Safe::getGpc( 'user_name','P' );
   	   $sPassword = Safe::getGpc( 'user_password','P' );

	   if( $this->_arrOptions['loginseccode'] ){

   	       $sSeccode  = Safe::getGpc( 'seccode' );

   	       // 判断验证码是否正确
   	       // 并且尝试捕获错误
   	       UserModel::M( )->checkSeccode( $sSeccode );
   	       if( UserModel::M()->isBehaviorError() ){

               $this->E ( UserModel::M()->getBehaviorErrorMessage() );
           }

	   }

       // 账号不能为空
   	   if( empty( $sUserName ) ) {

			$this->E( G::L( '帐号或者E-mail不能为空！' ) );
	   }

	   elseif ( empty( $sPassword ) ){

			$this->E( G::L( '密码不能为空！' ) );
	   }

	   // 检测是E-mail登录验证，还是帐号
	   // 启动日常验证检测程序
	   Check::RUN();
	   if( Check::C( $sUserName,'email' ) ){

	   	   $bEmail = true;
	   }

	   else{

	   	   $bEmail = false;
	   }

       // 登录验证
       // 这里还有一个参数为是否自动更新登录信息，默认开启
       // Rbac行为插件中的checkLogin( $sUsername, $sPassword,$bEmail=false, $bUpdateLogin = true )
       $oUser = UserModel::M()->checkLogin( $sUserName,$sPassword,$bEmail );

       // 尝试获取行为插件验证错误消息，没有错误，表示验证通过
       if( UserModel::M()->isBehaviorError() ){

           $this->E ( UserModel::M()->getBehaviorErrorMessage() );
       }

	   else{

           // 开始模型中的错误，如果没有那么路过
		   if( $oUser->isError( ) ){

		       $this->E( $oUser->getErrorMessage() );
		   }

           // 刚开始我们无法获取数据，因为刚开始验证完毕后，程序尚未从数据库获取用户登录信息
           // 这里可以使用$arrUserData = $oUser->userData() 获取数据
           // 同样也可以使用$arrUserData = UserModel->userData()
           // 还可以直接使用全局变量, $arrUserData = $GLOBALS[ $this->getCookieData[ G::C( 'RBAC_DATA_PREFIX' ).'authkey' ] ];
           $this->S( G::L( 'Hello %s,欢迎来到 DoYouHaoBaby 梦幻王国!',null,null,$sUserName ) );

	   }

   }

   /**
    * 修改密码页面
    */
   public function password(){

       $this->is_login();

       $arrUserData = UserModel::M()->userData();

       $this->assign('nUserId',$arrUserData['user_id'] );
   	   $this->assign( 'changepasswordseccode',$this->_arrOptions['changepasswordseccode'] );
   	   $this->display();
   }

   /**
    * 修改密码
    */
   public function change_pass(){

      $this->is_login();

      // 取得已经登录后的用户信息
      $arrUserData = UserModel::M()->userData();

       // 取得用户相关信息
   	   $sPassword = Safe::getGpc( 'user_password','P' );
   	   $sNewPassword = Safe::getGpc( 'new_password','P' );
   	   $sOldPassword = Safe::getGpc( 'old_password','P' );

   	   if( $sOldPassword=='' ){

   	   	   $this->E( G::L( '旧密码不能为空' ) );
   	   }

   	   if( $sPassword=='' ){

   	   	   $this->E( G::L( '新密码不能为空' ) );
   	   }

   	   if( $sPassword!=$sNewPassword ){

   	   	   $this->E( G::L( '两次输入的密码不一致' ) );
   	   }

   	   if( $this->_arrOptions['changepasswordseccode'] ){

	       $sSeccode = Safe::getGpc( 'seccode','G' );

           // 判断验证码是否正确
   	       // 并且尝试捕获错误
   	       UserModel::M( )->checkSeccode( $sSeccode );
   	       if( UserModel::M()->isBehaviorError() ){

               $this->E ( UserModel::M()->getBehaviorErrorMessage() );
           }
	   }

   	   // 修改密码
       UserModel::M( )->changePassword(  $arrUserData['user_name'],$sPassword,$sOldPassword );

       // 捕获行为插件中的错误
       if( UserModel::M()->isBehaviorError() ){

           $this->E( UserModel::M()->getBehaviorErrorMessage());
       }

	   else{

	   	   // 取得用户模型
   	       $oUser = UserModel::F( 'user_id =?',$arrUserData['user_id'] )->query();

   	       // 捕获错误
	      if( $oUser->isError() ){

	     	  $this->E( $oUser->getErrorMessage( ) );
	       }

	   	   $this->S( G::L( '密码修改成功，你需要重新登录！' ) );
	   }

   }

   /**
    * 获取用户信息
    */
   public function information(){

	    $this->is_login();

	    $arrUserData = UserModel::M()->userData();

		$arrUserInfo = UserModel::F()->getByuser_id( $arrUserData['user_id'] );

		$this->assign('arrUserInfo',$arrUserInfo );
		$this->assign('changeinfoseccode',$this->_arrOptions['changeinfoseccode']);

		$this->display();
   }

   /**
    * 修改个人资料
    */
   public function change_info() {

        $this->is_login();

        if( $this->_arrOptions['changeinfoseccode'] ){

	       $sSeccode = Safe::getGpc( 'seccode','P' );

           // 判断验证码是否正确
   	       // 并且尝试捕获错误
   	       UserModel::M( )->checkSeccode( $sSeccode );
   	       if( UserModel::M()->isBehaviorError() ){

               $this->E ( UserModel::M()->getBehaviorErrorMessage() );
           }

	    }

	   // 取得用户id
   	   $nUserId = Safe::getGpc( 'user_id','P' );

   	   // 取得用户模型
   	   $oUser = UserModel::F( 'user_id =?',$nUserId )->query();

   	   // 保存数据
   	   $oUser->save( 0,'update' );

	   // 捕获错误
	   if( $oUser->isError() ){

	   	   $this->E( $oUser->getErrorMessage( ) );
	   }

	   else{

	   	   $this->S( G::L( '修改用户资料成功了！' ) );
	   }

	}

   /**
    * 登出
    */
   public function logout( ){

   	   // 判断是否已经登录
       if(  UserModel::M()->isLogin( )  ) {

            // 取出当前用户登录信息
            $arrUserData = UserModel::M()->userData( );

       	    // 清理数据库session信息
       	    UserModel::M()->replaceSession( $arrUserData['session_hash'],$arrUserData['user_id'],$arrUserData['session_auth_key'],$arrUserData['session_seccode'] );

       	    // 清除登录cookie信息
       	    UserModel::M()->logout( );

            $this->assign("__JumpUrl__",G::U('public/login'));
            $this->S( G::L( '登出成功！' ) );
        }

        else {

            $this->E( G::L( '已经登出！' ) );
        }
    }

    /**
     * 菜单
     */
    public function fmenu( ) {

    	$this->is_login();

    	$sTag = Safe::getGpc( 'tag' );

        // 显示菜单项
        $arrMenuList  = UserModel::M( )->getMenuList();

        if( $sTag ===null ) $sTag ='';
        $this->assign( 'sMenuTag',$sTag );
		$this->assign('arrMenuList',$arrMenuList );

		G::C('SHOW_RUN_TIME',false);
		G::C('SHOW_PAGE_TRACE',false);

		$this->display();
	}

}
